#include "stm32f10x.h"                  // Device header
#include "MySPI.h"
#include "W25Q64_Ins.h"
//创建W25Q64模块，调用底层函数
void W25Q64_Init(void){
	MySPI_Init();
}
//通过指令集，来拼接完成功能
//JEDEC ID：读取ID号，发送9Fh指令，后续交换读取3个字节（厂商ID，后两个设备ID）
void W25Q64_ReadID(uint8_t *MID, uint16_t *DID)
{

	MySPI_Start();								//SPI起始
	MySPI_SwapByte(W25Q64_JEDEC_ID);			//交换发送读取ID的指令
	*MID = MySPI_SwapByte(W25Q64_DUMMY_BYTE);	//交换接收MID，通过输出参数返回
	*DID = MySPI_SwapByte(W25Q64_DUMMY_BYTE);	//交换接收DID高8位
	*DID <<= 8;									//高8位移到高位
	*DID |= MySPI_SwapByte(W25Q64_DUMMY_BYTE);	//或上交换接收DID的低8位，通过输出参数返回
	MySPI_Stop();								//SPI终止
}

//写使能指令,会自动关门
void W25Q64_WriteEnable(void){
	MySPI_Start();								//SPI起始
	MySPI_SwapByte(W25Q64_WRITE_ENABLE);
	MySPI_Stop();
}

//等待BUSY位
//事前等待（更高效，在每次写入读的之前等待）和事后等待
void W25Q64_WaitBusy(void){
	uint32_t Timeout;
	MySPI_Start();
	MySPI_SwapByte(W25Q64_READ_STATUS_REGISTER_1);
	Timeout=100000;
	while((MySPI_SwapByte(W25Q64_DUMMY_BYTE)&0x01)==0x01)
	{
		Timeout--;
		if(Timeout==0){
			break;
		}
	}
	MySPI_Stop();
}

//页编程的函数
void W25Q64_Pageprogram(uint32_t Address,uint8_t *DataArray,uint16_t Count){
	W25Q64_WriteEnable();
	
	uint16_t i;
	MySPI_Start();
	MySPI_SwapByte(W25Q64_PAGE_PROGRAM);//发送指令
	MySPI_SwapByte(Address>>16);//发送写入的地址，由于每次发8位，所以高位会省略
	MySPI_SwapByte(Address>>8);
	MySPI_SwapByte(Address);
	for(i=0;i<Count;i++){
		MySPI_SwapByte(DataArray[i]);
	}
	MySPI_Stop();
	W25Q64_WaitBusy();
}
//扇区擦除
void W25Q64_SectorErase(uint32_t Address){
	W25Q64_WriteEnable();
	MySPI_Start();
	
	MySPI_SwapByte(W25Q64_SECTOR_ERASE_4KB);
	MySPI_SwapByte(Address>>16);//发送写入的地址，由于每次发8位，所以高位会省略
	MySPI_SwapByte(Address>>8);
	MySPI_SwapByte(Address);
	
	MySPI_Stop();
	W25Q64_WaitBusy();
}
//读取数据
void W25Q64_ReadData(uint32_t Address,uint8_t *DataArray,uint32_t Count){
	uint16_t i;
	MySPI_Start();
	MySPI_SwapByte(W25Q64_READ_DATA);//发送指令
	MySPI_SwapByte(Address>>16);//发送写入的地址，由于每次发8位，所以高位会省略
	MySPI_SwapByte(Address>>8);
	MySPI_SwapByte(Address);
	for(i=0;i<Count;i++){
		DataArray[i]=MySPI_SwapByte(W25Q64_DUMMY_BYTE);
	}
	MySPI_Stop();
}



